#include <pthread.h>
#include <iostream>
#include <semaphore.h>

using namespace std;

int reader_count = 0;
pthread_mutex_t rlock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t wlock = PTHREAD_MUTEX_INITIALIZER;

void Reader()
{
        // 首先就是读者的加锁和解锁操作：
    // 首先对读者进行加锁
    pthread_mutex_lock(&rlock);
    reader_count++; //在这里将读者的数量+1
    // 接着判断读者是否为1，如果为1就证明这是第一个读者，此时申请写者的锁，就会有两种情况
    // 1、写者没有进行写入，所以写者也就没有申请到锁，所以读者申请成功锁，让以后写者无法进行写入
    // 2、写者正在进行写入，所以写者也就持有锁，那么第一个读者也就在这里申请失败锁，进入阻塞队列中等待
    if (reader_count == 1) 
    {
        pthread_mutex_lock(&wlock);
    }
    // 这里是释放的读者自己的锁，如果读者正在读，一定会持有写者的锁的
    pthread_mutex_unlock(&rlock);

    // 在这里进行读取，因为不需要维护读者之间的互斥关系也就不需要锁，直接进行读取即可
    
    //当读取完后，下面就是减少读者的代码
    pthread_mutex_lock(&rlock);

    reader_count--; // 将读者的数量-1
    //这里进行判断，如果读者的数量为0的时候释放写者的锁，此时写者就能够进行写入了
    if (reader_count == 0) 
    {
        pthread_mutex_lock(&wlock);
    }

    pthread_mutex_unlock(&rlock);
}

void Writer()
{
    // 然后是写者的加锁，写入数据，解锁
    pthread_mutex_lock(&wlock);
    
    //写入数据
    
    pthread_mutex_unlock(&wlock);
}